package cn.itcast.web.controller.dept;

import cn.itcast.domain.system.Module;
import cn.itcast.domain.system.Role;
import cn.itcast.service.system.ModuleService;
import cn.itcast.service.system.RoleService;
import cn.itcast.web.controller.BaseController;
import com.alibaba.druid.util.StringUtils;
import com.github.pagehelper.PageInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


@Controller
@RequestMapping("/system/role")
public class RoleController extends BaseController {
    @Autowired
    private RoleService roleService;

    @Autowired
    private ModuleService moduleService;

    /**
     * 角色列表分页
     */
    @RequestMapping("/list")
    public String list(
            @RequestParam(defaultValue = "1") int pageNum,
            @RequestParam(defaultValue = "5") int pageSize) {
        //初始化当前登录用户所属的企业ID为1
        String companyId = getLoginCompanyId();
        //1.调用service查询部门列表
        PageInfo pageInfo = roleService.findByPage(companyId, pageNum, pageSize);
        //2.返回
        request.setAttribute("pageInfo",pageInfo);
        return "system/role/role-list";
    }

    /**
     * 进入新增角色页面
     */
    @RequestMapping("/toAdd")
    public String toAdd() {
        return "system/role/role-add";
    }

    /**
     * 新增角色
     */
    @RequestMapping("/edit")
    public String edit(Role role) {

        role.setCompanyId(getLoginCompanyId());
        role.setCompanyName(getLoginCompanyName());

        //1.判断是否具有id属性
        if(StringUtils.isEmpty(role.getId())) {
            //2.没有id，保存
            roleService.save(role);
        }else{
            //3.具有id，更新
            roleService.update(role);
        }
        return "redirect:/system/role/list";
    }

    /**
     * 进入到修改界面
     *  1.获取到id，根据id进行查询
     *  2.保存查询结果到request域中
     *  3.跳转到修改界面
     */
    @RequestMapping("/toUpdate")
    public String toUpdate(String id){
        Role role = roleService.findById(id);
        request.setAttribute("role",role);
        return "system/role/role-update";
    }

    /**
     * 删除角色
     */
    @RequestMapping("/delete")
    @ResponseBody
    public String delete(String id) {

        String result=roleService.delete(id);


        //跳转到修改界面
        return result;
    }

    //权限配置
    /**
     * 功能入口：role-list
     * 请求地址：roleModele
     * 请求参数：角色id
     * 响应地址：role-module
     */
    @RequestMapping("/roleModule")
    public String roleModule(String roleId){
        //1.根据角色id去查询角色对象
        Role role = roleService.findById(roleId);
        //2.保存数据到域里
        request.setAttribute("role",role);
        return "system/role/role-module";
    }


    /**
     * 角色分配权限，返回json格式数据
     * 功能入口：role-model.jsp发送异步请求
     * 请求地址：/system/role/getZtreeNodes
     * 请求数据：roleId
     * 响应数据：[               json格式，外层数组，内层对象，key:value
     *  { id:2, pId:0, name:"随意勾选 2", checked:true, open:true}
     * ]
     */

    @RequestMapping("/getZtreeNodes")
    @ResponseBody
    public  List<Map<String,Object>> getZtreeNodes(String roleId){
        //1.创建返回的集合
        List<Map<String,Object>>result=new ArrayList<>();
        //2.查询所有的权限
        List<Module> moduleList = moduleService.finAll();
        //3.查询角色已经拥有的权限
        List<Module>roleModule= moduleService.findModuleByRoleId(roleId);
        //4.遍历所有的权限
        for (Module module : moduleList) {
            Map<String , Object>map=new HashMap<>();
            //这里的key必须固定，否则ztree加载不了
            map.put("id",module.getId());
            map.put("pId",module.getParentId());
            map.put("name",module.getName());
            map.put("open",true);
            //判断，当前角色已经拥有的权限，是否包含遍历的权限，若包含则选中
               if (roleModule.contains(module)){
                   map.put("checked",true);
               }
            //添加到集合
            result.add(map);
        }
        return result;
    }


    /**
     * 角色分配权限，保存
     * 请求地址：/system/role/updateRoleModule
     * 请求参数：角色id:roleId,权限id:moduleIds
     * 响应地址：重定向到角色列表
     */
    @RequestMapping("updateRoleModule")
    public String updateRoleModule(String roleId,String moduleIds){
        //1.调用service实现角色分配权限,根据角色id权限id去保存权限
        roleService.updateRoleModule(roleId,moduleIds);
        return "redirect:/system/role/list";
    }
}
